/*
	File:				Ability.h
	Course:		SGP 1208
	Author:		Kori Po
	Purpose:	Ability object class
*/

#pragma once

#include "Entity.h"
#include "SpriteAnimatorFireball.h"

#include "IListener.h"
#include "../SGD Wrappers/CSGD_TextureManager.h"
#include "MessageSystem.h"
#include "../SGD Wrappers/CSGD_XAudio2.h"

#define FROCEBACK 25
#define FROCEFRONT 25

enum Application_Type {BURST, CONTINUOUS, EoT};
enum AoE_Type {SINGLE, LINEAR, RADIUS, GLOBAL};

class CAbility : public CEntity
{
private:
	// Name
	char*	m_strName;
	
	//Cost
	int	m_nManaCost;
	int	m_nCoolDown;

	// Movement
	int	m_nPlayerMovement;
	int	m_nTargetMovement;

	// Effect
	int	m_nDamage;
	int	m_nHeal;
	int	m_nBuff;
	int	m_nNerf;
	
	// Application Type
	int	m_nApplication;

	// AoE Type
	int	m_nAoE;

	// Others
	float												fCurrentRotation;
	CEntity*											m_pOwner;
	CSpriteAnimatorFireball*			Hadouken;

	// Wrapper Classes
	CSGD_TextureManager*		m_TextureGuy;
	CMessageSystem*						m_Messenger;
	CSGD_XAudio2*							m_AudioGuy;

	// Are u the first player ability?
	bool m_bFirst;
	
	int m_nAbilityIconID;

public:
	// Def Con && Decon
	CAbility(void);
	virtual ~CAbility(void);

	// Primary Running Functions
	void Update(float fElapsedTime);
	void Render(void);

	// Secondary Running Functions
	void Trigger(void);

	// Accessors
	char*			GetAbilityName				(void)		{ return m_strName;							}
	int				GetManaCost				(void)		{ return m_nManaCost;					}
	int				GetCoolDown				(void)		{ return m_nCoolDown;					}
	int				GetPlayerMovement	(void)		{ return m_nPlayerMovement;		}
	int				GetTargetMovement	(void)		{ return m_nTargetMovement;		}
	int				GetDamage					(void)		{ return m_nDamage;						}
	int				GetHeal							(void)		{ return m_nHeal;								}
	int				GetBuff								(void)		{ return m_nBuff;								}
	int				GetNerf								(void)		{ return m_nNerf;								}
	int				GetApp							(void)		{ return m_nApplication;					}
	int				GetAoE								(void)		{ return m_nAoE;								}
	CEntity*		GetOwner						(void)		{ return m_pOwner;							}

	// Mutator
	void	SetAbilityName				( char*	pString				)		{	m_strName							= pString;				}
	void	SetManaCost					( int		nCost						)		{	m_nManaCost					= nCost;				}
	void	GetCoolDown				( int		nCoolDown			)		{	m_nCoolDown					= nCoolDown;		}
	void	SetPlayerMovement		( int		nMovement		)		{	m_nPlayerMovement		=	nMovement;	}
	void	SetTargetMovement	( int		nMovement		)		{	m_nTargetMovement		=	nMovement;	}
	void	SetDamage						( int		nDamage			)		{	m_nDamage						=	nDamage;		}
	void	SetHeal								( int		nHeal						)		{	m_nHeal								=	nHeal;				}
	void	SetBuff								( int		nBuff						)		{	m_nBuff									=	nBuff;					}
	void	SetNerf								( int		nNerf						)		{	m_nNerf								=	nNerf;					}
	void	SetApp								( int		nApp						)		{	m_nApplication					=	nApp;				}
	void	SetAoE								( int		nAoE						)		{	m_nAoE								=	nAoE;					}
	void	SetOwner							( CEntity*	pOwner		)		{	m_pOwner							= pOwner;			}
};

